#pragma once
#include <vector>
#include <pthread.h>
#include <vector>
#include <iostream>
#include <queue>
using namespace std;
#define NUM 5
template<class T>
class threadPool
{
public:
    threadPool(int num = NUM)
        :_num(num)
    {
        //初始化互斥锁和条件变量
        pthread_mutex_init(&_mutx,nullptr);
        pthread_cond_init(&_cond,nullptr);
    }
    void init()
    {
        //创建一批线程
        for(int i = 1;i<=_num;++i)
        {
            pthread_t* pth = new(pthread_t);
            _ths.push_back(pth);
        }
    }
    static void* thread_run(void* arg)
    {
        pthread_detach(pthread_self());
        auto ptr = static_cast<threadPool<T>*>(arg);
        while(true)
        {
            //上锁
            pthread_mutex_lock(&ptr->_mutx);
            while (ptr->_task.empty())
            {
                //没有任务就开始等待
                /* code */
                pthread_cond_wait(&ptr->_cond,&ptr->_mutx);
            }
            //有任务了，可以开始执行任务了
            T task = ptr->_task.front();
            ptr->_task.pop();
            //取到任务
            cout<<"开始执行任务:"<<task<<endl;
            //解锁
            pthread_mutex_unlock(&ptr->_mutx);
        }
    }
    void start()
    {
        //启动线程
        for(int i = 0;i<_num;++i)
        {
            pthread_create(_ths[i],nullptr,thread_run,this);
        }
    }
    ~threadPool()
    {
        //销毁创建的那一批线程
        for(int i = 0;i<_num;++i)
        {
            delete _ths[i];
        }
        //销毁互斥锁的条件变量
        pthread_mutex_destroy(&_mutx);
        pthread_cond_destroy(&_cond);
    }

    void push_task(T task)
    {
        //加锁
        pthread_mutex_lock(&_mutx);
        _task.push(task);
        pthread_cond_signal(&_cond);//唤醒线程
        pthread_mutex_unlock(&_mutx);
    }
private:
    int _num;//最大可以创建的线程数量
    vector<pthread_t*> _ths;
    queue<T> _task;
    pthread_mutex_t _mutx;
    pthread_cond_t _cond;
};